package offer.offer03;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 字符串操作并不熟悉, 了解一下是好事
 * 用一下lambda做批量处理
 *
 * 全排列问题, 回溯。
 */
public class S038字符串的排列 {
    /**
     * 11,
     */
    public String[] permutation(String s) {
        if(s == null || s.length() == 0) return new String[0];
        String[] strings = s.split("");//这样把s的每一个字符拆成一个String
        System.out.println(Arrays.toString(strings));//这才是打印数组的正确姿势
        List<String> retStrList = new ArrayList<>();
        retStrList.add(strings[0]);
        for(int i = 1; i < strings.length; i++){
            //此时, i为retStrList中每个String的长度, 注意这里拷走了retStrList的所有值,
            //但是String是final的, 所以其实也是没办法通过修改其他地方的s来改变List里面的值的;
            List<String> retStrListTmp = new ArrayList<>(retStrList);
            List<String> retStrListTmp2 = new ArrayList<>();
            final String lamStr = strings[i];
            for(int j = 0; j < i + 1; j++){
//                List<String> retStrListCopy = new ArrayList<>(retStrList);
                final int k = j;
                //下面这种用法没办法更改任何值, 不知道为什么, 再往下使用map就可以
//                retStrListCopy.forEach((String s1)->{
//                    s1 = s1.substring(0, k) + lamStr + s1.substring(k, s1.length());
//                });
                retStrListTmp2.addAll(retStrListTmp.stream().map(s1 -> s1.substring(0, k) + lamStr + s1.substring(k))
                        .collect(Collectors.toList()));
            }
            retStrList = retStrListTmp2;
        }
        Set<String> set1 = new HashSet<>(retStrList);
        String[] retStr = new String[set1.size()];//去重
        //String不是基本类型, 可以直接toArray从Collections变成数组
        retStr = set1.toArray(retStr);
        return retStr;
    }

    public static void main(String[] args) {
        String input = new String("zsdfe");
        String[] output = new S038字符串的排列().permutation(input);
        for(String s: output){
            System.out.println(s);
        }
    }
}
